home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / languages / obrn-a_1.5_lib.lha / oberon-a / source2.lha / Source / Library / Conversions.mod < prev    next >
Encoding:
Text File  |  1995-01-26  |  2.9 KB  |  102 lines

  1. (*************************************************************************
  2.  
  3.      $RCSfile: Conversions.mod $
  4.   Description: Conversion of basic types to and from strings.
  5.  
  6.    Created by: fjc (Frank Copeland)
  7.     $Revision: 1.3 $
  8.       $Author: fjc $
  9.         $Date: 1995/01/26 00:40:27 $
  10.  
  11.   Copyright © 1994-1995, Frank Copeland.
  12.   This file is part of the Oberon-A Library.
  13.   See Oberon-A.doc for conditions of use and distribution.
  14.  
  15. *************************************************************************)
  16.  
  17. <* MAIN- *> <*$ IndexChk- *> <*$ RangeChk- *> <*$ LongVars+ *>
  18.  
  19. MODULE Conversions;
  20.  
  21. CONST DIGITS = "0123456789ABCDEF";
  22.  
  23. VAR digits : ARRAY 17 OF CHAR;
  24.  
  25.  
  26. PROCEDURE IntToStr *
  27.   ( int : LONGINT;
  28.     base, field : INTEGER;
  29.     padCh : CHAR;
  30.     VAR str : ARRAY OF CHAR )
  31.   : BOOLEAN;
  32.  
  33.   VAR i, j, k : INTEGER; temp : ARRAY 34 OF CHAR; neg : BOOLEAN;
  34.  
  35. BEGIN (* IntToStr *)
  36.   IF (base < 2) OR (base > 16) OR ~(base IN {2,8,10,16}) THEN
  37.     RETURN FALSE
  38.   END;
  39.   IF field > (LEN (str) - 1) THEN RETURN FALSE END;
  40.   IF int < 0 THEN neg := TRUE; IF int # MIN (LONGINT) THEN int := -int END
  41.   ELSE neg := FALSE
  42.   END;
  43.   IF int = MIN (LONGINT) THEN
  44.     IF base = 2 THEN temp := "1111111111111111111111111111111"; i := 31
  45.     ELSIF base = 8 THEN temp := "77777777771"; i := 11
  46.     ELSIF base = 10 THEN temp := "8463847412"; i := 10
  47.     ELSIF base = 16 THEN temp := "FFFFFFF7"; i := 8
  48.     END
  49.   ELSE
  50.     i := 0;
  51.     REPEAT
  52.       temp [i] := digits [SHORT (int MOD base)]; INC (i);
  53.       int := int DIV base
  54.     UNTIL int = 0;
  55.   END;
  56.   IF neg & (padCh # "0") THEN neg := FALSE; temp [i] := "-"; INC (i) END;
  57.   IF (neg & (i > (LEN (str) - 2))) OR (i > (LEN (str) - 1)) THEN
  58.     RETURN FALSE
  59.   END;
  60.   j := i; k := 0;
  61.   IF neg THEN str [k] := "-"; DEC (field); INC (k) END;
  62.   WHILE j < field DO str [k] := padCh; INC (j); INC (k) END;
  63.   WHILE i > 0 DO DEC (i); str [k] := temp [i]; INC (k) END;
  64.   str [k] := 0X;
  65.   RETURN TRUE
  66. END IntToStr;
  67.  
  68.  
  69. PROCEDURE StrToInt *
  70.   ( str : ARRAY OF CHAR; base : INTEGER; VAR int : LONGINT )
  71.   : BOOLEAN;
  72.  
  73.   VAR i, d, temp, limit : LONGINT; ch : CHAR; neg : BOOLEAN;
  74.  
  75. <*$CopyArrays-*>
  76. BEGIN (* StrToInt *)
  77.   IF (base < 2) OR (base > 16) THEN RETURN FALSE END;
  78.   limit := MAX (LONGINT) DIV base; i := 0; ch := str [i];
  79.   WHILE (ch # 0X) & (ch <= " ") DO INC (i); ch := str [i] END;
  80.   IF ch = "-" THEN neg := TRUE; INC (i); ch := str [i]
  81.   ELSE neg := FALSE
  82.   END;
  83.   temp := 0;
  84.   WHILE ch > " " DO
  85.     IF (ch >= "0") & (ch <= "9") THEN d := ORD (ch) - ORD ("0")
  86.     ELSIF (ch >= "A") & (ch <= "F") THEN d := ORD (ch) - (ORD ("A") - 10)
  87.     ELSIF (ch >= "a") & (ch <= "f") THEN d := ORD (ch) - (ORD ("a") - 10)
  88.     ELSE RETURN FALSE
  89.     END;
  90.     IF d >= base THEN RETURN FALSE END;
  91.     IF (limit - d) < temp THEN RETURN FALSE END;
  92.     temp := temp * base + d;
  93.     INC (i); ch := str [i]
  94.   END;
  95.   IF neg THEN int := -temp ELSE int := temp END;
  96.   RETURN TRUE
  97. END StrToInt;
  98.  
  99. BEGIN
  100.   digits := DIGITS
  101. END Conversions.
  102.